package java学习.leetcode.editor.cn;

import java.util.Arrays;

/**
 * @author 刘世锦
 * 2022-10-05 12:09:04	 当前时间
 */
//给定两个字符串 s 和 t ，编写一个函数来判断 t 是否是 s 的字母异位词。 
//
// 注意：若 s 和 t 中每个字符出现的次数都相同，则称 s 和 t 互为字母异位词。 
//
// 
//
// 示例 1: 
//
// 
//输入: s = "anagram", t = "nagaram"
//输出: true
// 
//
// 示例 2: 
//
// 
//输入: s = "rat", t = "car"
//输出: false 
//
// 
//
// 提示: 
//
// 
// 1 <= s.length, t.length <= 5 * 104 
// s 和 t 仅包含小写字母 
// 
//
// 
//
// 进阶: 如果输入字符串包含 unicode 字符怎么办？你能否调整你的解法来应对这种情况？ 
// Related Topics 哈希表 字符串 排序 
// 👍 673 👎 0

public class 有效的字母异位词{
	public static void main(String[] args) {
		Solution solution = new 有效的字母异位词().new Solution();
		String s = "anagram", t = "nagaram";
		System.out.println(solution.isAnagram(s, t));
	}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {

//		直接sort 后比较。
	public boolean isAnagram1(String s, String t) {
		char[] chars = s.toCharArray();
		char[] chars1 = t.toCharArray();
		Arrays.sort(chars);
		Arrays.sort(chars1);
		return Arrays.equals(chars, chars1);

	}


//输入: s = "anagram", t = "nagaram"
//输出: true
//	 两个map，再判相等
	public boolean isAnagram2(String s, String t) {
		int[] arr1 = func(s);
		int[] arr2 = func(t);
//		System.out.println(Arrays.compare(arr1, arr2));
		for (int i = 0; i < arr1.length; i++) {
			if (arr1[i] != arr2[i]) {
				return false;
			}
		}
		return true;
	}

	public int[] func(String s) {
		int[] map = new int[26];
		for (int i = 0; i < s.length(); i++) {
			map[s.charAt(i) - 'a']++;
		}
//		System.out.println(Arrays.toString(map));
//		Arrays.equals(arr1,arr2);
		return map;
	}
//	hash：使用一个map数组即可
	public boolean isAnagram (String s, String t) {
		int[] map = new int[26];
		for (int i = 0; i < s.length(); i++) {
			map[s.charAt(i) - 'a']++;
		}
		for (int i = 0; i < t.length(); i++) {
			map[t.charAt(i) - 'a']--;
		}
		for (int i = 0; i < map.length; i++) {
			if (map[i]!=0){
				return false;
			}
		}
		return true;

	}

//	官方。
	public boolean isAnagram3(String s, String t) {
		int[] map = new int[26];
		if (s.length()!=t.length()){
			return false;
		}
		for (int i = 0; i < s.length(); i++) {
			map[s.charAt(i) - 'a']++;
		}
		for (int i = 0; i < t.length(); i++) {
			map[t.charAt(i) - 'a']--;
			if (map[t.charAt(i)-'a'] < 0) {
				return false;
			}
		}
		return true;
	}
}
//leetcode submit region end(Prohibit modification and deletion)

}
